package veterinaria.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.DefaultStreamedContent;

import br.com.sgc.entities.geral.Cliente;
import br.com.sgc.entities.veterinaria.Animal;
import br.com.sgc.entities.veterinaria.Especie;
import br.com.sgc.entities.veterinaria.Pelagem;
import br.com.sgc.entities.veterinaria.Raca;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.session.AnimalSession;
import br.com.sgc.session.GenericSession;

@Named
@ConversationScoped
public class AnimalManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = -337691528243362447L;
	
	@EJB private AnimalSession animalSession;
	
	@EJB private GenericSession<Raca> racaSession;
	
	@EJB private GenericSession<Especie> especieSession;
	
	@EJB private GenericSession<Pelagem> pelagemSession;
	
	@Inject private UtilManager utilManager;
	
	private Animal animal = new Animal();
	
	private Cliente cliente;
	
	private List<Animal> animais = new ArrayList<Animal>();
	
	private List<Raca> racas = new ArrayList<Raca>();
	
	private List<Especie> especies = new ArrayList<Especie>();
	
	private List<Pelagem> pelagens = new ArrayList<Pelagem>();
	
	
	private Boolean disableInputs;
	
	private void fillListas(){
		racas = racaSession.findAll(Raca.class, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		especies = especieSession.findAll(Especie.class , utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		pelagens = pelagemSession.findAll(Pelagem.class, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
	}
	
	
	public void prepareSave(){
		fillListas();
		animal = new Animal();
		disableInputs = false;
	}
	
	public void prepareUpdate() {
		animal = animalSession.findById(Animal.class, animal.getId(), true);
		if(animal.getFotoAnimal() != null)
			utilManager.getImagemManager().setFoto(new DefaultStreamedContent(new ByteArrayInputStream(animal.getFotoAnimal())));
		
		fillListas();
		disableInputs = false;
	}
	
	public void addAnimal(){
		animal.setPelagem(pelagemSession.findById(Pelagem.class, animal.getPelagem().getId()));
		animal.setRaca(racaSession.findById(Raca.class, animal.getRaca().getId()));
		animal.setEspecie(especieSession.findById(Especie.class, animal.getEspecie().getId()));
		animal.setDonoAnimal(cliente);
		animal.setFotoAnimal(utilManager.getImagemManager().getDataByte());
		animais.add(animal);
		animal = new Animal();
	}
	
	public void removeAnimal(){
		animais.remove(animal);
		animal = new Animal();
	}
	
	public void update(){
		try {
			animal.setPelagem(pelagemSession.findById(Pelagem.class, animal.getPelagem().getId()));
			animal.setRaca(racaSession.findById(Raca.class, animal.getRaca().getId()));
			animal.setEspecie(especieSession.findById(Especie.class, animal.getEspecie().getId()));
			animal.setDonoAnimal(utilManager.getClienteManager().getClienteSession().findById(Cliente.class, animal.getDonoAnimal().getId()));
			animal.setFotoAnimal(utilManager.getImagemManager().getDataByte());
			utilManager.getImagemManager().setFoto(null);
			utilManager.getImagemManager().setDataByte(null);
			animalSession.update(animal);
			animal = new Animal();
			FacesUtil.mensInfo("Pet Atualizado com Sucesso.");
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensErro(e.getMessage());
		}
		
	}

	
	public Boolean getDisableInputs() {
		return disableInputs;
	}

	public void setDisableInputs(Boolean disableInputs) {
		this.disableInputs = disableInputs;
	}

	public AnimalSession getAnimalSession() {
		return animalSession;
	}

	public void setAnimalSession(AnimalSession animalSession) {
		this.animalSession = animalSession;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}


	public Cliente getCliente() {
		return cliente;
	}


	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}


	public List<Animal> getAnimais() {
		return animais;
	}


	public void setAnimais(List<Animal> animais) {
		this.animais = animais;
	}


	public List<Raca> getRacas() {
		return racas;
	}


	public void setRacas(List<Raca> racas) {
		this.racas = racas;
	}


	public List<Especie> getEspecies() {
		return especies;
	}


	public void setEspecies(List<Especie> especies) {
		this.especies = especies;
	}


	public List<Pelagem> getPelagens() {
		return pelagens;
	}


	public void setPelagens(List<Pelagem> pelagens) {
		this.pelagens = pelagens;
	}

}
